package com.boomshake.common;

import lombok.Data;
import java.util.List;

/**
 * 分页结果封装类
 * @param <T> 数据类型
 */
@Data
public class PageResult<T> {
    /**
     * 总记录数
     */
    private long total;
    
    /**
     * 当前页数据
     */
    private List<T> list;
    
    /**
     * 当前页码
     */
    private int pageNum;
    
    /**
     * 每页记录数
     */
    private int pageSize;
    
    /**
     * 总页数
     */
    private int pages;
    
    /**
     * 是否有下一页
     */
    private boolean hasNextPage;
    
    /**
     * 是否有上一页
     */
    private boolean hasPreviousPage;
    
    /**
     * 构造方法
     * @param list 当前页数据
     * @param total 总记录数
     * @param pageNum 当前页码
     * @param pageSize 每页记录数
     */
    public PageResult(List<T> list, long total, int pageNum, int pageSize) {
        this.list = list;
        this.total = total;
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.pages = (int) ((total + pageSize - 1) / pageSize);
        this.hasNextPage = pageNum < pages;
        this.hasPreviousPage = pageNum > 1;
    }
    
    /**
     * 空结果构造方法
     * @param pageNum 当前页码
     * @param pageSize 每页记录数
     * @param <T> 数据类型
     * @return 空分页结果
     */
    public static <T> PageResult<T> empty(int pageNum, int pageSize) {
        return new PageResult<>(java.util.Collections.emptyList(), 0, pageNum, pageSize);
    }
    
    /**
     * 空结果构造方法（接收查询对象）
     * @param pageQuery 分页查询参数，需要包含page和size属性
     * @param <T> 数据类型
     * @param <Q> 查询参数类型
     * @return 空分页结果
     */
    public static <T, Q> PageResult<T> empty(Q pageQuery) {
        try {
            java.lang.reflect.Field pageField = pageQuery.getClass().getDeclaredField("page");
            java.lang.reflect.Field sizeField = pageQuery.getClass().getDeclaredField("size");
            pageField.setAccessible(true);
            sizeField.setAccessible(true);
            int page = (int) pageField.get(pageQuery);
            int size = (int) sizeField.get(pageQuery);
            return empty(page, size);
        } catch (Exception e) {
            throw new RuntimeException("创建空分页结果失败", e);
        }
    }
    
    /**
     * 从分页查询DTO创建分页结果
     * @param list 当前页数据
     * @param total 总记录数
     * @param pageQuery 分页查询参数，需要包含page和size属性
     * @param <T> 数据类型
     * @param <Q> 查询参数类型
     * @return 分页结果
     */
    public static <T, Q> PageResult<T> of(List<T> list, long total, Q pageQuery) {
        try {
            java.lang.reflect.Field pageField = pageQuery.getClass().getDeclaredField("page");
            java.lang.reflect.Field sizeField = pageQuery.getClass().getDeclaredField("size");
            pageField.setAccessible(true);
            sizeField.setAccessible(true);
            int page = (int) pageField.get(pageQuery);
            int size = (int) sizeField.get(pageQuery);
            return new PageResult<>(list, total, page, size);
        } catch (Exception e) {
            throw new RuntimeException("创建分页结果失败", e);
        }
    }
} 